package com.firewolf.spring.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;

import com.firewolf.spring.entities.User;

@Repository
public class UserDao {

	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	private DataSource ds;

	/**
	 * @Description: 执行ddl语句，如：生成表 @输入和输出示例： @思路：
	 */
	public void exeDDL() {
		String sql = "create table t_user(id int(11) not null auto_increment primary key,name varchar(30),age int(11))";
		jdbcTemplate.execute(sql);
	}

	/**
	 * 新增 @输入和输出示例： @思路：
	 * 
	 * @param u
	 */
	public void saveUser() {
		User u = new User("刘兴", 26);
		String sql = "insert into t_user (name,age) values(?,?)";
		jdbcTemplate.update(sql, u.getName(), u.getAge());
	}

	/**
	 * @Description: 修改 @输入和输出示例： @思路：
	 */
	public void updateUser() {
		String sql = "update t_user set name=? where id=?";
		jdbcTemplate.update(sql, "zhangsan", 1);
	}

	/**
	 * @Description:删除 @输入和输出示例： @思路：
	 */
	public void delete() {
		String sql = "delete from t_user where id=?";
		jdbcTemplate.update(sql, 1);
	}

	/**
	 * @Description: 批量更新 @输入和输出示例： @思路：
	 */
	public void batchUpdate() {
		String sql = "insert into t_user (name,age) values(?,?)";
		List<Object[]> args = new ArrayList<>();
		args.add(new Object[] { "lisi", 26 });
		args.add(new Object[] { "wangwu", 27 });
		jdbcTemplate.batchUpdate(sql, args);
	}

	/**
	 * @Description: 查询单行 @输入和输出示例： @思路：
	 */
	public void qryObject() {
		String sql = "select * from t_user where id=?";
		RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
		User u = jdbcTemplate.queryForObject(sql, rowMapper, 6);
		System.out.println(u);
	}

	/**
	 * @Description: 查询集合 @输入和输出示例： @思路：
	 */
	public void qryList() {
		String sql = "select * from t_user where 1=?";
		RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
		List<User> query = jdbcTemplate.query(sql, rowMapper, 1);
		System.out.println(query);
	}

	/**
	 * @Description: 统计数量 @输入和输出示例： @思路：
	 */
	public void qryCout() {
		String sql = "select count(*) from t_user";
		int count = jdbcTemplate.queryForObject(sql, Integer.class);
		System.out.println(count);
	}

	/**
	 * @Description: 使用回调类自己封装 @输入和输出示例： @思路：
	 */
	public void qry() {
		jdbcTemplate.query("", new RowCallbackHandler() {
			@Override
			public void processRow(ResultSet arg0) throws SQLException {
				// 直接处理
			}
		});
	}
	
	public void namedSql(){
		NamedParameterJdbcTemplate nj = new NamedParameterJdbcTemplate(ds);
		String sql = "select * from t_user where id=:id";
		RowMapper<User> mapper = new BeanPropertyRowMapper<>(User.class);
		Map<String, String> param = new HashMap<>();
		param.put("id", "2");
		List<User> query = nj.query(sql, param, mapper);
		System.out.println(query);
	}
}